在下拉式選單中 select
tag 上使用 v-model option
的選擇將會是 model 的 value
<h3>晚餐吃什麼?</h3>
<select v-model="dinner">
<option value='A'>1、帕瑪森和牛咖喱飯</option>
<option value='B'>2、石安松板丼飯</option>
<option value='C'>3、炙燒戰斧拉麵</option>
</select>
// 如果選擇: 3、炙燒戰斧拉麵
// dinner: 'C'
範例中我們使用在 搜尋高雄地區選項 ,因此我們在 option 的顯示文字
與 value
中都綁定上地區值。
而預設的 全部(all)
就手動加個 tag
<select id="searchRegion"class="form-control" v-model="searchRegion">
<option value='all'>全部</option>
<option v-for="option in regionOption" :value="option">
{{ option }}
</option>
</select>
watch 用於監聽 model,
key 為 model name
匿名參數將會是 model value
以範例來說,當 select 改變時,會雙向綁定 option value
因此我們監聽 searchRegion
(預設是 all)
將改變的 value 發出 action 改變 state
state 改變 getter 將會重新計算,因此我們得到新的搜尋結果。
watch: {
searchRegion (val) {
this.$store.dispatch('opendataSearchRegion', val);
}
},
這樣的功能在 select tag 使用 @change 事件,一樣可以做到同樣功能 Performance 也會好一點點。
Vue v-else, v-else-if
這是 if 家族系列 directive 使用如程式中的 if else
條件判斷,還滿直覺的知道幾組 tag 是同一個 group
!
今天我們把它用在搜尋結果顯示上,
如果無搜尋結果會顯示一段文字告訴使用者找不到相關內容,
如果有會顯示結果列表與數量。
如果使用系列會建議把這些 directive 放在第一個,否則未來維護的同事會.. OOXX#%!
不放在第一個不容易看呀!
搜尋功能的實現,設計在 getter 裡面,改變取得資料的結果,而原始資料不動,應該是最理想的,最後做了一個比較直覺的函式,大家參考一下囉..
將原始資料儲存在另一變數下_opendata
,出現搜尋條件的時候,使用 filter 過濾條件,回傳結果。
UI 只要判斷結果的長度,0 = 搜尋不到。
比較簡單使用 filter 判斷每筆資料的 ZipName_
既可。
這邊打算可以搜尋每筆資料所有的內容,後來想到把每個 item 用 JSON.stringify
變成 String
在與 keyword 做判斷indexOf( state.search.keyword ) != -1
既可。
const getters = {
getOpen1999: state => {
let _opendata = state.opendata;
if (state.search.region !== 'all') {
_opendata = _opendata.filter( item => (item.ZipName_ === state.search.region) );
}
if (state.search.keyword !== '') {
_opendata = _opendata.filter( item => (JSON.stringify( item ).indexOf( state.search.keyword ) != -1) );
}
return _opendata;
}
}
<template>
<div class="container">
<nav class="navbar navbar-default">
<!-- 略.. -->
<div class="container-fluid">
<div class="navbar-form navbar-left">
<div class="form-group">
<label for="searchRegion">搜尋地區:</label>
<!-- select 使用 v-model 會與 option value 綁定 -->
<select id="searchRegion"class="form-control" v-model="searchRegion">
<option value='all'>全部</option>
<option v-for="option in regionOption" :value="option">
{{ option }}
</option>
</select>
</div>
<div class="input-group">
<input
type="text"
class="form-control"
placeholder="Search"
v-model="searchKeyword"
@keyup.enter="handleWorkSearch">
<div class="input-group-btn">
<button class="btn btn-default" @click="handleWorkSearch">
<i class="glyphicon glyphicon-search"></i>
</button>
</div>
</div>
</div>
</div>
</nav>
<hr>
<!-- if -->
<div v-if="opendate.length===0" class="alert alert-info" role="alert">
很抱歉!找不到您要的資訊。
</div>
<!-- else -->
<div v-else>
<div class="alert alert-success" role="alert">
總共查到:{{ opendate.length }} 筆資料。
</div>
<!-- card 略.. -->
</div>
</div>
</template>
<script>
import { mapGetters, mapActions } from 'vuex';
export default {
data() {
return {
searchRegion: 'all',
searchKeyword: '',
}
},
created () {
// created Hook 發出 action call API
this.$store.dispatch('open1999');
},
computed: mapGetters({
opendate: 'getOpen1999',
regionOption: 'getRegionOption'
}),
methods: {
...mapActions([
]),
getGoogleMap(address) {
// Template literals
// ${裡面可以放變數}
// ES5: "https://www.google.com/maps/place/" + address;
return `https://www.google.com/maps/place/${address}`;
},
handleWorkSearch () {
this.$store.dispatch('opendataSearchKeyword', this.searchKeyword);
},
},
watch: {
searchRegion (val) {
this.$store.dispatch('opendataSearchRegion', val);
}
},
};
</script>
實作小範例入門 Vue & Vuex 2.0 - github 完整範例
使用 git checkout 切換每天範例。